package model.agent
import groovy.transform.CompileStatic

import org.codehaus.groovy.runtime.NullObject


/**
 * agent.addP
 * agent.money = 1  		//增加money序列的最后一位，并设为1 
 * println agent.money 		//打印money序列的最后一位
 * println agent.money_1	//打印money的倒数第二位，和groovy的默认做法有点不同
 * agent.money_1 = 1		//错误。历史是只读的。
 * agent.money = null 		//NullPointerException
 * 
 * @author itsaquestion
 *
 */
@CompileStatic
class Agent {

	int who

	String type


	int number;

	static int MAX_HIS = 30

	final static int DIGIT = 5

	public String getType(){
		return type
	}

	HashMap prop = [:]

	
	def inspected = false

	def out (value) {
		if(inspected){
			println value.toString()
		}
	}

	/**
	 * 获得属性和其最后值的map
	 * 如，有属性a=[1,2,3]，b=[2,3,4]
	 * 则返回map : [a:3,b:4]
	 * @return 属性和其最后值的map
	 */
	def getProp (){
		def list = [:]
		prop.each{ key, value ->
			list[key] = null
			if(((ArrayList)value).size()>0){
				list[key]=((ArrayList)value)[-1]
			}
		}
		return list
	}

	/**
	 * 构造函数，type = 类型名
	 */
	def Agent(){
		type = this.class.getSimpleName()
	}

	def other(ArrayList<Agent> aa){
		return aa.findAll { Agent a->  a!=this }
	}

	//	def exec(Closure commands){
	//		commands.delegate = this
	//		commands()
	//		//println bb
	//		//println this.properties
	//	}

	/**
	 * 新建一个空的属性序列
	 * @param name 属性名
	 * @return
	 */
	def addProperty(String name){
		//		addProperty(name,[])
		prop[name] = []
	}

	/**
	 * 获得指定属性的ArrayList
	 * @param name 属性名
	 * @return 指定属性的ArrayList
	 */
	ArrayList getPropertyArray(String name){
		if(prop.containsKey(name)){

			return (ArrayList)prop[name]
		}else{
			throw new groovy.lang.MissingPropertyException("此属性不存在：" + name.toString())
		}
	}

	/**
	 * 获得属性值
	 * @param name 属性名，如"money","money_1"等。可以加引号，如firms.money和firms."money"都合法。
	 * @return 如果"money"，则返回最后值；"money_1"，则返回倒数第二个值
	 */
	def propertyMissing(String name) {
		def key = name
		def soffset = "0"
		int offset = 0
		if (name.contains("_")) {
			String[] s = name.split("_")
			key = s[0]
			soffset=s[1]
			offset = soffset.toInteger()
		}

		if(prop.containsKey(key)){
			ArrayList p = (ArrayList)prop[key]
			if(p.size() > offset){
				def value = p[-(1 + offset)]

				return value
			}
		}else{
			throw new groovy.lang.MissingPropertyException("此属性不存在：" + key.toString())
		}
		return null
	}

	/**
	 * 设置属性值，新值添加到属性序列的最后一个位，超过MAX_HIS的丢弃最早的
	 * @param name 属性名，但是不能带有_
	 * @param value 属性值
	 * @return 无
	 */
	def propertyMissing(String name, value) {

		(value.toString()) // 自动扔出NullPointerException

		def key = name

		if (key.contains("_")){
			throw new Exception(this.type + ":历史是只读的!不能对变量的滞后值进行赋值")
		}

		if(prop.containsKey(key)){
			ArrayList p = (ArrayList)prop[key]
			if(((String)value).isNumber()){
				p.add(((float)value).round(DIGIT))
			}else{
				p.add(value)
			}


			//太长就去掉第一个
			if(p.size() > MAX_HIS){p.remove(0)}
			//println "size:" + prop[key].size()

		}else{
			throw new groovy.lang.MissingPropertyException("此属性不存在："+ key.toString())
		}
	}

	String toString(){
		return "${this.class.getSimpleName()}($who)"
	}
}

